home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 21 / Cream of the Crop 21 (Terry Blount) (October 1996).iso / os2 / vsoup11.zip / reply.cc < prev    next >
C/C++ Source or Header  |  1996-09-01  |  9KB  |  400 lines

  1. //  $Id: reply.cc 1.10 1996/09/01 12:12:47 hardy Exp $
  2. //
  3. //  This progam/module was written by Hardy Griech based on ideas and
  4. //  pieces of code from Chin Huang (cthuang@io.org).  Bug reports should
  5. //  be submitted to rgriech@ibm.net.
  6. //
  7. //  This file is part of soup++ for OS/2.  Soup++ including this file
  8. //  is freeware.  There is no warranty of any kind implied.  The terms
  9. //  of the GNU Gernal Public Licence are valid for this piece of software.
  10. //
  11. //  Send reply packet.
  12. //
  13.  
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18.  
  19. #include "global.hh"
  20. #include "mts.hh"
  21. #include "reply.hh"
  22. #include "util.hh"
  23.  
  24. #include "nntpcl.hh"
  25. #include "smtp.hh"
  26. #include "socket.hh"
  27.  
  28. static TSocket smtpSock;
  29. static TNntp nntpReply;
  30. static char *mailer;
  31. static char *poster;
  32.  
  33.  
  34.  
  35. static int sendPipe (FILE *fd, size_t bytes, const char *agent)
  36. //
  37. //  Pipe a message to the specified delivery agent.
  38. //
  39. {
  40.     FILE *pfd;
  41.     unsigned char c;
  42.  
  43.     /* Open pipe to agent */
  44.     if ((pfd = popenT(agent, "w")) == NULL) {
  45.     areas.mailPrintf1( 1,"%s: cannot open reply pipe\n", progname);
  46.     while (bytes--)
  47.         fgetcT(fd);
  48.     return 0;
  49.     }
  50.  
  51.     /* Send message to pipe */
  52.     while (bytes--) {
  53.     c = fgetcT(fd);
  54.     fputcT(c, pfd);
  55.     }
  56.  
  57.     pcloseT(pfd);
  58.     return 1;
  59. }   // sendPipe
  60.  
  61.  
  62.  
  63. static int sendMail (FILE *inf, size_t bytes)
  64. {
  65.     int res = 1;
  66.     if (mailer) {
  67.     const char *to = getHeader(inf, "To");
  68.     areas.mailPrintf1(1,"%s: mailing to %s\n", progname, to);
  69. ////    delete to;
  70.  
  71.     /* Pipe message to delivery agent */
  72.     res = sendPipe(inf, bytes, mailer);
  73.     }
  74.     else {
  75.     if ( !smtpMail(smtpSock, inf, bytes)) {
  76.         areas.mailPrintf1( 1,"%s: cannot deliver mail\n",progname );
  77.         res = 0;
  78.     }
  79.     }
  80.     return res;
  81. }   // sendMail
  82.  
  83.  
  84.  
  85. static int sendNews (FILE *inf, size_t bytes)
  86. {
  87.     int res = 1;
  88.     const char *grp;
  89.  
  90.     grp = getHeader( inf, "Newsgroups" );
  91.     areas.mailPrintf1(1,"%s: posting article to %s\n", progname, grp);
  92. ////    delete grp;
  93.  
  94.     if (poster) {
  95.     /* Pipe message to delivery agent */
  96.     res = sendPipe(inf, bytes, poster);
  97.     } else {
  98.     if (nntpReply.postArticle( inf,bytes ) != TNntp::ok) {
  99.         areas.mailPrintf1( 1,"%s: cannot post article: %s\n",
  100.                    progname,nntpReply.getLastErrMsg());
  101.         res = 0;
  102.     }
  103.     }
  104.     return res;
  105. }   // sendNews
  106.  
  107.  
  108.  
  109. static int sendMailu (const char *fn)
  110. //
  111. //  Process a mail reply file, usenet type
  112. //
  113. {
  114.     char buf[BUFSIZ];
  115.     FILE *fd;
  116.     int bytes;
  117.     int res = 1;
  118.  
  119.     //
  120.     //  Open the reply file
  121.     //  problem here is non-fatal!
  122.     //
  123.     if ((fd = fopenT (fn, "rb")) == NULL) {
  124.     areas.mailPrintf1( 1,"%s: cannot open file %s\n", progname,fn );
  125.     return 1;
  126.     }
  127.  
  128.     /* Read through it */
  129.     while (fgetsT(buf, sizeof(buf), fd)) {
  130.     if (strncmp (buf, "#! rnews ", 9)) {
  131.         areas.mailPrintf1( 1,"%s: malformed reply file\n", progname);
  132.         res = 0;
  133.         break;
  134.     }
  135.  
  136.     /* Get byte count */
  137.     sscanfT(buf+9, "%d", &bytes);
  138.  
  139.     if ( !sendMail(fd, bytes)) {
  140.         res = 0;
  141.         break;
  142.     }
  143.     }
  144.     fcloseT(fd);
  145.     return res;
  146. }   // sendMailu
  147.  
  148.  
  149.  
  150. static int sendNewsu (const char *fn)
  151. //
  152. //  Process a news reply file, usenet type
  153. //
  154. {
  155.     char buf[BUFSIZ];
  156.     FILE *fd;
  157.     int bytes;
  158.     int res = 1;
  159.  
  160.     //
  161.     //  Open the reply file
  162.     //  problem here is non-fatal!
  163.     //
  164.     if ((fd = fopenT (fn, "rb")) == NULL) {
  165.     areas.mailPrintf1( 1,"%s: cannot open file %s\n", progname,fn );
  166.     return 1;
  167.     }
  168.  
  169.     /* Read through it */
  170.     while (fgetsT(buf, sizeof(buf), fd)) {
  171.     if (strncmp (buf, "#! rnews ", 9)) {
  172.         areas.mailPrintf1( 1,"%s: malformed reply file\n", progname);
  173.         res = 0;
  174.         break;
  175.     }
  176.  
  177.     sscanfT(buf+9, "%d", &bytes);
  178.     if ( !sendNews(fd, bytes)) {
  179.         res = 0;
  180.         break;
  181.     }
  182.     }
  183.     fcloseT(fd);
  184.     return res;
  185. }   // sendNewsu
  186.  
  187.  
  188.  
  189. static int sendMailb (const char *fn)
  190. //
  191. //  Process a mail reply file, binary type
  192. //
  193. {
  194.     unsigned char count[4];
  195.     FILE *fd;
  196.     int bytes;
  197.     int res = 1;
  198.  
  199.     //
  200.     //  Open the reply file
  201.     //  problem here is non-fatal!
  202.     //
  203.     if ((fd = fopenT (fn, "rb")) == NULL) {
  204.     areas.mailPrintf1( 1,"%s: cannot open file %s\n", progname,fn );
  205.     return 1;
  206.     }
  207.  
  208.     /* Read through it */
  209.     while (freadT(count, sizeof(char), 4, fd) == 4) {
  210.     /* Get byte count */
  211.     bytes = ((count[0]*256 + count[1])*256 + count[2])*256 + count[3];
  212.     if ( !sendMail(fd, bytes)) {
  213.         res = 0;
  214.         break;
  215.     }
  216.     }
  217.  
  218.     fcloseT(fd);
  219.     return res;
  220. }   // sendMailb
  221.  
  222.  
  223.  
  224. static int sendNewsb (const char *fn)
  225. //
  226. //  Process a news reply file, binary type
  227. //
  228. {
  229.     unsigned char count[4];
  230.     FILE *fd;
  231.     int bytes;
  232.     int res = 1;
  233.  
  234.     //
  235.     //  Open the reply file
  236.     //  problem here is non-fatal!
  237.     //
  238.     if ((fd = fopenT (fn, "rb")) == NULL) {
  239.     areas.mailPrintf1( 1,"%s: cannot open file %s\n", progname,fn );
  240.     return 1;
  241.     }
  242.  
  243.     /* Read through it */
  244.     while (freadT(count, sizeof(char), 4, fd) == 4) {
  245.     bytes = ((count[0]*256 + count[1])*256 + count[2])*256 + count[3];
  246.     if ( !sendNews(fd, bytes)) {
  247.         res = 0;
  248.         break;
  249.     }
  250.     }
  251.     fcloseT(fd);
  252.     return res;
  253. }   // sendNewsb
  254.  
  255.  
  256.  
  257. int sendReply (void)
  258. //
  259. //  Process a reply packet.
  260. //
  261. {
  262.     FILE *rep_fd;
  263.     char buf[BUFSIZ];
  264.     char fname[FILENAME_MAX], kind[FILENAME_MAX], type[FILENAME_MAX];
  265.     int mailError = 0;
  266.     int nntpError = 0;
  267.  
  268.     mailer = getenv("MAILER");
  269.     poster = getenv("POSTER");
  270.     
  271.     /* Open the packet */
  272.     if ((rep_fd = fopenT(FN_REPLIES, "rb")) == NULL) {
  273.     areas.mailPrintf1( 1,"%s: can't open file %s\n", progname, FN_REPLIES);
  274.     return 0;
  275.     }
  276.  
  277.     /* Look through lines in REPLIES file */
  278.     while (fgetsT(buf, sizeof(buf), rep_fd)) {
  279.     if (sscanfT(buf, "%s %s %s", fname, kind, type) != 3) {
  280.         areas.mailPrintf1( 1,"%s: malformed REPLIES line\n", progname);
  281.         return 0;
  282.     }
  283.  
  284.     /* Check reply type */
  285.     if (type[0] != 'u' && type[0] != 'b' && type[0] != 'B') {
  286.         areas.mailPrintf1( 1,"%s: reply type %c not supported\n", progname,
  287.                    type[0]);
  288.         continue;
  289.     }
  290.  
  291.     //
  292.     //  Look for mail or news
  293.     //  and first try to connect
  294.     //
  295.     if (strcmp(kind, "mail") == 0) {
  296.         if (mailError)
  297.         continue;
  298.         if ( !mailer  &&  smtpSock.state() != TSocket::connected) {
  299.         if (smtpInfo.host == NULL) {
  300.             areas.mailPrintf1( 1,"%s: no smtp gateway defined\n", progname );
  301.             mailError = 1;
  302.             continue;
  303.         }
  304.         else if ( !smtpConnect(smtpSock)) {
  305.             areas.mailPrintf1( 1,"%s: cannot connect to smtp gateway %s\n",
  306.                        progname, smtpInfo.host );
  307.             mailError = 1;
  308.             continue;
  309.         }
  310.         else
  311.             areas.mailPrintf1( 1,"%s: connected to smtp gateway %s\n",
  312.                        progname, smtpInfo.host );
  313.         }
  314.     } else if (strcmp(kind, "news") == 0) {
  315.         if (nntpError)
  316.         continue;
  317.         if ( !poster) {
  318.         if (nntpInfo.host == NULL) {
  319.             areas.mailPrintf1( 1,"%s: no news server defined\n", progname );
  320.             nntpError = 1;
  321.             continue;
  322.         }
  323.         else if (nntpReply.open(nntpInfo.host,nntpInfo.user,nntpInfo.passwd) != TNntp::ok) {
  324.             areas.mailPrintf1( 1,"%s: cannot connect to news server %s (post):\n\t%s\n",
  325.                        progname, (nntpInfo.host != NULL) ? nntpInfo.host : "\b",
  326.                        nntpReply.getLastErrMsg() );
  327.             nntpError = 1;
  328.             continue;
  329.         }
  330.         else
  331.             areas.mailPrintf1( 1,"%s: connected to news server %s (post)\n",
  332.                        progname, nntpInfo.host );
  333.         }
  334.     }
  335.     else {
  336.         areas.mailPrintf1( 1,"%s: bad reply kind: %s\n", progname, kind);
  337.         continue;
  338.     }
  339.  
  340.     /* Make file name */
  341.     strcat(fname, ".MSG");
  342.  
  343.     /*
  344.     **  Wenn Datei nicht existiert heißt das, daß sie schon
  345.     **  versendet wurde (und dies sozusagen ein RETRY ist)
  346.     */
  347.  
  348.     /* Process it */
  349.     switch (type[0]) {
  350.     case 'u':
  351.         if (strcmp(kind, "mail") == 0) {
  352.         if ( !sendMailu(fname)) {
  353.             mailError = 1;
  354.             continue;
  355.         }
  356.         }
  357.         else if (strcmp(kind, "news") == 0) {
  358.         if ( !sendNewsu(fname)) {
  359.             nntpError = 1;
  360.             continue;
  361.         }
  362.         }
  363.         break;
  364.     case 'b':
  365.     case 'B':
  366.